﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using CastleDefender.ConfigFolder;
using CastleDefender.Platform.ScreenBehavior;
using CastleDefender.Object;

namespace CastleDefender.Platform
{
    public partial class GameBar : DrawableGameComponent
    {
        #region VARIABLE

        protected SpriteBatch sprBatch;
        protected List<Texture2D> lstTexture;
        protected List<GameComponent> lstComponents;
        protected TouchBehavior tbTouch;
        protected TimeSpan tsTimeChangeMoveStep;
        protected SpriteFont sfFontArrows;
        protected SpriteFont sfFontInfo;
        protected Button btnChooseArrowNormal;
        protected Button btnChooseArrowFire;
        protected Button btnChooseArrowElectric;
        protected Button btnPause;
        protected Button btnMusic;
        protected Animation2D aniEffectSpeedUp;
        protected Animation2D aniEffectSpeedDown;
        protected int intAmountArrowsNormal;
        protected int intAmountArrowsFire;
        protected int intAmountArrowsElectric;
        protected int intTypeArrows;
        protected int intMoveStep;
        protected int intScore;
        protected int intLevel;
        protected float fltHeart;
        protected bool blnPause;
        private Texture2D textureHeart;
        private Rectangle recHeart;
        private Vector2 vecPosHeart;

        #endregion

        #region CONSTRUCTOR

        public GameBar(Game myGame, ref List<Texture2D> listTexture, Vector2 Position, ref TouchBehavior touch)
            : base(myGame)
        {
            sprBatch = (SpriteBatch)myGame.Services.GetService(typeof(SpriteBatch));
            sfFontArrows = myGame.Content.Load<SpriteFont>(Config.FolderFonts + "FontItems");
            sfFontInfo = myGame.Content.Load<SpriteFont>(Config.FolderFonts + "FontInfo");
            lstComponents = new List<GameComponent>();
            lstTexture = listTexture;
            tbTouch = touch;
            intTypeArrows = 0;
            blnPause = false;

            //Ô chọn tên thường
            Texture2D textureChooseArrowNormal = lstTexture[0];
            btnChooseArrowNormal = new Button(myGame, ref textureChooseArrowNormal, 45, 45, false, false, Position + Config.GameBarMargin);

            //Ô chọn tên lửa
            Texture2D textureChooseArrowFire = lstTexture[1];
            btnChooseArrowFire = new Button(myGame, ref textureChooseArrowFire, 45, 45, false, false, Position + Config.GameBarMargin*2);

            //Ô chọn tên băng
            Texture2D textureChooseArrowIce = lstTexture[2];
            btnChooseArrowElectric = new Button(myGame, ref textureChooseArrowIce, 45, 45, false, false, Position + Config.GameBarMargin * 3);

            //Nút bấm tạm dừng
            Texture2D textureButtonPause = myGame.Content.Load<Texture2D>(Config.FolderButtons + "Pause");
            btnPause = new Button(myGame, ref textureButtonPause, 40, 40, true, false, Position + Config.GameBarMargin * 4);

            //Nút bấm âm nhạc
            Texture2D textureButtonMusic = myGame.Content.Load<Texture2D>(Config.FolderButtons + "Music");
            btnMusic = new Button(myGame, ref textureButtonMusic, 40, 40, true, false, Position + Config.GameBarMargin * 5);

            //Hiệu ứng tăng tốc độ di chuyển của quái có trên bản đồ
            Texture2D textureSpeedUp = myGame.Content.Load<Texture2D>(Config.FolderObject + Config.FolderItems + "SpeedUp");
            aniEffectSpeedUp = new Animation2D(myGame, ref textureSpeedUp, 45, 45, false, true, Position + Config.GameBarMargin * 5, 100);
            aniEffectSpeedUp.Visible = false;

            //Hiệu ứng giảm tốc độ di chuyển của quái có trên bản đồ
            Texture2D textureSpeedDown = myGame.Content.Load<Texture2D>(Config.FolderObject+ Config.FolderItems + "SpeedDown");
            aniEffectSpeedDown = new Animation2D(myGame, ref textureSpeedDown, 45, 45, false, true, Position + Config.GameBarMargin * 5, 100);
            aniEffectSpeedDown.Visible = false;

            //HP
            textureHeart = myGame.Content.Load<Texture2D>(Config.FolderObject + "Heart");
            recHeart = new Rectangle();
            vecPosHeart = new Vector2(Config.ScreenSize.X - textureHeart.Width - 5, 5);

            lstComponents.Add(btnChooseArrowNormal);
            lstComponents.Add(btnChooseArrowFire);
            lstComponents.Add(btnChooseArrowElectric);
            lstComponents.Add(btnPause);
          //  lstComponents.Add(btnMusic);
            lstComponents.Add(aniEffectSpeedUp);
            lstComponents.Add(aniEffectSpeedDown);
        }
        #endregion

        #region PUBLIC METHOD

        public override void Initialize()
        {
            for (int i = 0; i < lstComponents.Count; i++)
            {
                lstComponents[i].Initialize();
            }
            base.Initialize();
        }

        public override void Update(GameTime gameTime)
        {
            //Lấy loại mũi tên
            SetTypeArrows();
            ChangeButtonAboutTypeArrow();

            for (int i = 0; i < lstComponents.Count; i++)
            {
                lstComponents[i].Update(gameTime);
            }
            base.Update(gameTime);
        }

        public override void Draw(GameTime gameTime)
        {
            for (int i = 0; i < lstComponents.Count; i++)
            {
                GameComponent current = lstComponents[i];
                if (current is DrawableGameComponent && ((DrawableGameComponent)current).Visible && ((DrawableGameComponent)current).Enabled)
                {
                    ((DrawableGameComponent)current).Draw(gameTime);
                }
            }

            sprBatch.DrawString(sfFontArrows, intAmountArrowsNormal.ToString(), btnChooseArrowNormal.Position + new Vector2(0, 30), Color.White);
            sprBatch.DrawString(sfFontArrows, intAmountArrowsFire.ToString(), btnChooseArrowFire.Position + new Vector2(0, 30), Color.White);
            sprBatch.DrawString(sfFontArrows, intAmountArrowsElectric.ToString(), btnChooseArrowElectric.Position + new Vector2(0, 30), Color.White);
            sprBatch.Draw(textureHeart, vecPosHeart, recHeart, Color.White);
            sprBatch.DrawString(sfFontInfo, "Score : " + intScore.ToString(), btnChooseArrowNormal.Position - Config.GameBarMargin + new Vector2(90, 5), Color.White);
            sprBatch.DrawString(sfFontInfo, "Level : " + intLevel.ToString(), btnChooseArrowNormal.Position - Config.GameBarMargin + new Vector2(400, 5), Color.White);
            base.Draw(gameTime);
        }

        //Nhận loại hiệu ứng di chuyển của quái vật khi item được kích hoạt
        public void GetMoveStepItem(int monsterStep)
        {
            intMoveStep = monsterStep;
            
            //Khi kích hoạt vật phẩm tăng tốc quái
            if (intMoveStep == Config.MonsterMoveStepFast)
            {
                aniEffectSpeedUp.Visible = true;
                aniEffectSpeedDown.Visible = false;
            }

            //Khi kích hoạt vật phẩm giảm tốc quái
            if (intMoveStep == Config.MonsterMoveStepVerySlow)
            {
                aniEffectSpeedDown.Visible = true;
                aniEffectSpeedUp.Visible = false;
            }

            //Khi hết thời gian tác dụng
            if (intMoveStep == Config.MonsterMoveStepNormal)
            {
                aniEffectSpeedDown.Visible = false;
                aniEffectSpeedUp.Visible = false;
            }
        }

        //Nhận số lượng mũi tên mới
        public void GetInfo(int amountArrowsNormal, int amountArrowsFire, int amountArrowsIce, int Heart)
        {
            intAmountArrowsNormal = amountArrowsNormal > 0 ? amountArrowsNormal : 0;
            intAmountArrowsFire = amountArrowsFire > 0 ? amountArrowsFire : 0;
            intAmountArrowsElectric = amountArrowsIce > 0 ? amountArrowsIce : 0;
            fltHeart = Heart;
            recHeart = new Rectangle(0, 0,(int)(fltHeart / Config.BowHeartCastle * 180 + 43), textureHeart.Height);
            ChangeTypeArrows();
        }
      
        #endregion

        #region PRIVATE METHOD

        //Lấy loại tên được chọn
        private void SetTypeArrows()
        {
            //Thiết lập các sự kiện nút bấm press
            if (tbTouch.IsPressed)
            {
                Point pos = new Point((int)tbTouch.PosPress.X, (int)tbTouch.PosPress.Y);
                btnChooseArrowNormal.GetTouchPosition(pos);
                btnChooseArrowFire.GetTouchPosition(pos);
                btnChooseArrowElectric.GetTouchPosition(pos);
                btnPause.GetTouchPosition(pos);
                btnMusic.GetTouchPosition(pos);

                //Khi một trong các nút bấm được kích hoạt
                if (btnChooseArrowNormal.Touch || btnChooseArrowFire.Touch || btnChooseArrowElectric.Touch)
                {
                    //Tăt hiệu ứng tất cả các nút bấm
                    SetOffButtonsArrow();

                    if (btnChooseArrowNormal.Touch && intAmountArrowsNormal != 0)
                    {
                        intTypeArrows = 0;
                    }

                    if (btnChooseArrowFire.Touch && intAmountArrowsFire != 0)
                    {
                        intTypeArrows = 1;
                    }

                    if (btnChooseArrowElectric.Touch && intAmountArrowsElectric != 0)
                    {
                        intTypeArrows = 2;
                    }
                }
            }

            //Thiết lập riêng cho nút bấm tạm dừng
            if (tbTouch.IsKeyUp && btnPause.Touch)
            {
                btnPause.Active = true;
                btnPause.GetTouchPosition(Point.Zero);
                blnPause = true;
            }

            //Thiết lập riêng cho nút bấm âm thanh
            if (tbTouch.IsKeyUp && btnMusic.Touch)
            {
                btnMusic.Active = !btnMusic.Active;
                btnMusic.GetTouchPosition(Point.Zero);
            }


        }

        //Ngừng hoạt động tất cả nút bấm chọn tên
        private void SetOffButtonsArrow()
        {
            btnChooseArrowNormal.Active = false;
            btnChooseArrowFire.Active = false;
            btnChooseArrowElectric.Active = false;
        }

        //Xét chọn loại tên khác khi hết tên
        private void ChangeTypeArrows()
        {
            //Khi hết mũi tên thường
            if (intTypeArrows == 0 && intAmountArrowsNormal == 0)
            {
                intTypeArrows = 1;
            }

            //Khi hết mũi tên lửa
            if (intTypeArrows == 1 && intAmountArrowsFire == 0)
            {
                intTypeArrows = 2;
            }

            //Khi hết mũi tên điện
            if (intTypeArrows == 2 && intAmountArrowsElectric == 0)
            {
                intTypeArrows = 0;
            }
        }

        //Thể hiện nút bấm theo loại mũi tên
        private void ChangeButtonAboutTypeArrow()
        {
            SetOffButtonsArrow();
            //Khi mũi tên thường
            if (intTypeArrows == 0)
            {
                btnChooseArrowNormal.Active = true;
            }

            //Khi mũi tên lửa
            if (intTypeArrows == 1)
            {
                btnChooseArrowFire.Active = true;
            }

            //Khi mũi tên điện
            if (intTypeArrows == 2)
            {
                btnChooseArrowElectric.Active = true;
            }

        }

        #endregion

        #region PUBLIC PROPERTIES

        //Nhận trả giá trị intTypeArrows
        public int TypeArrows
        {
            get { return intTypeArrows; }
        }

        //Nhận trả giá trị blnPause
        public bool Pause
        {
            get { return blnPause; }
            set 
            { 
                blnPause = value;
                if (!blnPause)
                {
                    btnPause.Active = blnPause;
                }
            }
        }

        //Nhân trả giá trị intScore
        public int Score
        {
            get { return intScore; }
            set { intScore = value; }
        }

        //Nhận trả giá trị intLevel
        public int Level
        {
            get { return intLevel; }
            set { intLevel = value; }
        }

        #endregion

    }
}
